package com.adminsystem.java.user.controller;

import com.adminsystem.java.common.PageResult;
import com.adminsystem.java.common.ResultCode;
import com.adminsystem.java.user.pojo.param.*;
import com.adminsystem.java.common.Result;
import com.adminsystem.java.user.pojo.vo.LoginUserVO;
import com.adminsystem.java.user.pojo.vo.UserImportVO;
import com.adminsystem.java.user.pojo.vo.UserVO;
import com.adminsystem.java.user.service.UserService;
import com.adminsystem.java.utils.ExcelUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

/**
 * @author wangpeiao
 */
@Slf4j
@RestController
@RequestMapping("/myAdminSystem/user")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    /**
     * 用户注册接口
     *
     * @param param 注册参数
     * @return 注册结果
     */
    @PostMapping("/register")
    public Result register(@Validated @RequestBody UserRegisterParam param) {
        return userService.register(param);
    }

    /**
     * 用户登录接口
     *
     * @param param 登录参数
     * @return 登录结果
     */
    @PostMapping("/login")
    public Result<LoginUserVO> login(@Validated @RequestBody UserLoginParam param) {
        return userService.login(param);
    }

    /**
     * 用户登出（前端清除 token 即可）
     */
    @PostMapping("/logout")
    public Result<Void> logout() {
        log.info("用户登出");
        return Result.success(null);
    }

    /**
     * 获取当前登录用户信息
     */
    @GetMapping("/current")
    public Result<UserVO> getCurrentUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || !authentication.isAuthenticated()) {
            return Result.fail(ResultCode.UNAUTHORIZED);
        }
        Object principal = authentication.getPrincipal();
        if (principal instanceof UserVO) {
            return Result.success((UserVO) principal);
        } else {
            return Result.fail(ResultCode.UNAUTHORIZED);
        }
    }

    /**
     * 忘记密码接口
     *
     * @param param 忘记密码参数
     * @return 忘记密码结果
     */
    @PostMapping("/forgot-password")
    public Result<Void> forgotPassword(@RequestBody ForgotPasswordParam param) {
        return userService.forgotPassword(param);
    }

    /**
     * 重置密码接口
     *
     * @param param 重置密码参数
     * @return 重置密码结果
     */
    @PostMapping("/reset-password")
    public Result<Void> resetPassword(@RequestBody ResetPasswordParam param) {
        return userService.resetPassword(param);
    }

    /**
     * 获取用户列表接口
     *
     * @param param 用户列表参数
     * @return 用户列表结果
     */
    @GetMapping("/list")
    public Result<PageResult<UserVO>> getUserListByPage(UserPageParam param) {
        return Result.success(userService.getUserListByPage(param));
    }

    /**
     * 获取用户详情接口
     *
     * @param username 用户名
     * @return 用户详细信息
     */
    @GetMapping("/detail")
    public Result<UserVO> getUserDetail(@RequestParam String username) {
        return userService.getUserDetail(username);
    }

    /**
     * 编辑用户信息
     * @param param 编辑参数
     * @return 操作结果
     */
    @PutMapping("/edit")
    public Result<Void> editUser(@Validated @RequestBody UserEditParam param) {
        log.info("收到用户编辑请求，参数: {}", param);
        Result<Void> result = userService.editUser(param);
        log.info("用户编辑请求完成，结果: {}", result);
        return result;
    }

    /**
     * 删除用户
     * @param username 用户名
     * @return 操作结果
     */
    @DeleteMapping("/delete")
    public Result<Void> deleteUser(@RequestParam String username) {
        log.info("收到用户删除请求，用户名: {}", username);
        Result<Void> result = userService.deleteUser(username);
        log.info("用户删除请求完成，结果: {}", result);
        return result;
    }

    /**
     * 新增用户接口
     * @param param 新增参数
     * @return 操作结果
     */
    @PostMapping("/add")
    public Result<Void> addUser(@Validated @RequestBody UserAddParam param) {
        log.info("收到新增用户请求，参数: {}", param);
        Result<Void> result = userService.addUser(param);
        log.info("新增用户请求完成，结果: {}", result);
        return result;
    }

    /**
     * 修改用户状态（启用/禁用）
     * @param username 用户名
     * @param status 用户状态（0:禁用, 1:启用）
     * @return 操作结果
     */
    @PutMapping("/change-status")
    public Result<Void> changeUserStatus(@RequestParam String username, @RequestParam Integer status) {
        log.info("收到修改用户状态请求，用户名: {}, 状态: {}", username, status);
        try {
            Result<Void> result = userService.changeUserStatus(username, status);
            log.info("修改用户状态完成，结果: {}", result);
            return result;
        } catch (Exception e) {
            log.error("修改用户状态异常，用户名: {}，状态: {}，异常: {}", username, status, e.getMessage(), e);
            return Result.fail(ResultCode.FAILED);
        }
    }

    /**
     * 批量删除用户（通过IDs）
     *
     * @param param 包含用户ID列表的参数
     * @return 操作结果
     */
    @DeleteMapping("/deleteByIds")
    public Result<Void> deleteUsersByIds(@Validated @RequestBody UserDeleteByIdsParam param) {
        log.info("收到批量删除用户请求，ids: {}", param.getIds());
        Result<Void> result = userService.deleteUsersByIds(param);
        log.info("批量删除用户完成，结果: {}", result);
        return result;
    }

    @PostMapping("/download")
    public void downloadTemplate(HttpServletResponse response) {
        log.info("收到下载用户导入模版请求");
        List<UserImportVO> list = new ArrayList<>();
        list.add(new UserImportVO());

        log.info("模版数据: {}", list);
        // 这里可以放一些模版数据
        ExcelUtil.exportExcel(list, UserImportVO.class, "用户导入模版", response);
    }

}